<?php
/**
 * PrynLib
 * @copyright 2007-2009 Prynel
 * @author Olivier ROGER <roger.olivier@gmail.com>
 * @category libPrynel
 * @package Util
 * @version $Revision: 114 $
 */

/**
 * Classe String
 *
 * Class de gestion de string
 *
 * @category libPrynel
 * @package Util
 * @version 1.7.6 
 * @author Olivier ROGER <roger.olivier@gmail.com>
 * @copyright  2007-2009 Prynel
 *  
 */

class Util_String
{
	/**
	 * Constructeur.
	 */
	function __construct()
	{
	}
	
	/**
	* Caractère en HTML. Transforme les caractère spéciaux en équivalent html
	* @access public
	* @param string $chaine Chaine à transformer
	* @static
	* @return string Chaine transformer
	**/
	
	public static function nohtml($chaine)
	{
		$chaine = htmlspecialchars($chaine, ENT_QUOTES);
		return $chaine;
	}

	/**
	* Ajout de slashe. Ajoute des slashes si magiquotes desactivé
	* @access public
	* @param string $chaine Chaine à traiter
	* @static
	* @return string Chaine complétée par des /
	**/
	
	public static function slashes($chaine)
	{
		if (!get_magic_quotes_gpc()) {
    			$chaine = addslashes($chaine);
		} else {
    			$chaine = $chaine;
		}
		return $chaine;
	}
	
	/**
	* Pas de tag . Supprime tous les tags html et php d'une chaine
	* @access public
	* @param string $chaine Chaine à traiter
	* @param string $allowed (optionnel) balise HTML à ne pas supprimer
	* @static
	* @return string Chaine traitée
	**/
	
	public static function notag($chaine,$allowed='')
	{
		if($allowed!='')
			$chaine = strip_tags($chaine,$allowed);
		else
			$chaine = strip_tags($chaine);
		return $chaine;
	}
	
	/**
	* Nettoyage de chaine. Reécrit une chaine pour supprimer espace et caractère spéciaux, accentués ...
	* @access public
	* @param string $titre Chaine à traiter
	* @param boolean $utf8 LA chaine à traiter est elle en utf8 ?
	* @static
	* @return string chaine modifiée
	**/
	public static function cleantitre($titre,$utf8 = true)
	{
		if($utf8){
			$titre = htmlentities($titre,ENT_NOQUOTES,'utf-8');
			$titre = preg_replace('#\&([A-za-z])(?:acute|cedil|circ|grave|ring|tilde|uml)\;#', '\1', $titre);
			$titre = preg_replace('#\&([A-za-z]{2})(?:lig)\;#', '\1', $titre); // Pour les ligature
		}
		$search 	= array ('@[éèêëÊË]@i','@[àâäÂÄ]@i','@[îïÎÏ]@i','@[ûùüÛÜ]@i','@[ôöÔÖ]@i','@[ç]@i','@[ ]@i','@[^a-zA-Z0-9_]@');
		$replace 	= array ('e','a','i','u','o','c','_','');
		$titre	 	= preg_replace($search, $replace, $titre);
		$titre		= strtolower($titre);
		$titre		= str_replace(" ","-",$titre);
		$titre		= preg_replace('#\-+#','-',$titre);
		$titre		= preg_replace('#([-]+)#','-',$titre);
		trim($titre,'-');
		return $titre;
	}
	
	/**
	* Découpe de chaine. Découpe une chaine au nombre de mot souhaité
	* @access public
	* @param string $chaine Chaine à traiter
	* @param int $taillemax Nombre de caractère maxi
	* @static
	* @return string Chaine tronquée
	**/
	public static function cutchaine($chaine,$taillemax)
	{
		$max=$taillemax; 
		if(strlen($chaine)>=$max)
		{
			$chaine=substr($chaine,0,$max); 
			$espace=strrpos($chaine," "); 
			$chaine=substr($chaine,0,$espace)."..."; 
		}
		return $chaine;
	}
	
	/**
	* Validité html : Change toutes les entité  en code html pour validiter xhtml
	* @access public
	* @param string $chaine Chaine à traiter
	* @static
	* @return string chaine modifiée
	**/
	
	public static function validhtml($chaine)
	{
	   $chaine = htmlentities($chaine,ENT_QUOTES);
		return $chaine;
	}
	
	/**
	* Génération "aléatoire". Génère une string de longeur $taille. 
	* La génération favorise les chaines facilement mémorisable
	* @access public
	* @param int $taille Taille de la chaine désirée
	* @static
	* @return string
	**/
	public static function generatestring($taille)
	{

		//Consonnes
		$cons = 'bBcCdDfFgGhHjJkKlLmMnNoOpPqQrRsStTvVwWxXzZ@!#$%123465789';
		//Voyelles
		$voy = 'aAeEuUyY123465789'; // pas de o et i pour éviter confusion
		$genere='';
		$genere.= $cons[rand(0,41)]; // On commence forcément par une lettre
 		for ($i=1;$i<=($taille-1);$i++)
 		{
 			if($i%2==0)
 				$genere.=$cons[(rand(0,strlen($cons)-1))];
 			else
 				$genere.=$voy[(rand(0,strlen($voy)-1))];
 		} 
		return $genere;
	}
	
	/**
	 * Retourne une chaine sous le format camelCase
	 *
	 * @param string $string
	 * @return string
	 */
	public static function camelize($string)
	{
		return preg_replace("/[_|\s]([a-z0-9])/e", "strtoupper('\\1')", strtolower($string));
	}
	
	/**
	 * Fonction de geekiserie pour des propos plus intelligents
	 *
	 * @param string $string
	 * @return string
	 */
	public static function geekize($string)
	{
		$string = strtolower($string);
		$normal = array('a','e','t','l','s','o');
		$geek   = array('4','3','7','1','$','0');
		return str_replace($normal,$geek,$string);
	}
	/**
	* Anti majuscule. Vérifie que la chaine ne comporte pas trop de majuscule (50%)
	* @access public
	* @param string $pseudo Chaine à vérifier
	* @static
	* @return string
	**/
	
	public static function antimaj ($pseudo)
	{
		$seuil = strlen($pseudo)/2;
		$correspondance = similar_text($pseudo, strtolower($pseudo));
		if($correspondance < $seuil)
		return strtolower($pseudo);
		else
		return $pseudo;
	}
	
	/**
	 * Vérifie si une chaine est en majuscule
	 *
	 * @param string $string Chaine d'entrée
	 * @return boolean
	 */
	public static function isUpper($string)
	{
		if(preg_match("/[a-z]/", $string)>0)
			return false;
		return true;
	}
	
	/**
	 * Vérifie si une chaine est en minuscule
	 *
	 * @param string $string Chaine d'entrée
	 * @return boolean
	 */
	public static function isLower($string)
	{
		if(preg_match("/[A-Z]/", $string)>0)
			return false;
		return true;
	}
	
	/**
	* Vérification IP. Vérifie que la chaine est une ip valide
	* @access public
	* @param string $ip Adresse Ip à vérifier
	* @static
	* @return boolean
	**/
	
	public static function isIp($ip)
	{
		$motif = '`^([0-9]{1,3}\.){3}[0-9]{1,3}$`';
		if(preg_match($motif,$ip))
		{
			$ipArray = explode(".",$ip);
			for($i=0;$i<4;$i++)
			{
				if($ipArray[$i]>255)
				{
					return false;
				}
			}
			return true;
		}
		else
			return false;
	}
	
	/**
	* Vérification MAC. Vérifie que la chaine est une adresse MAC valide
	* @access public
	* @param string $mac Adresse MAC à vérifier
	* @static
	* @return boolean
	**/
	
	public static function isMac($mac)
	{
		$motif = '`^([[:xdigit:]]{2}\-){5}[[:xdigit:]]{2}$`';
		if(preg_match($motif,$mac))
			return true;
		else
			return false;
	}
	
	/**
	 * Vérifie la syntaxe d'un mail
	 *
	 * @param string $mail Adresse email
	 * @return boolean
	 */
	public static function isMail($mail)
	{
		if(function_exists('filter_var'))
			if(filter_var($mail,FILTER_VALIDATE_EMAIL))
				return true;
		else
		{
			$atom   = '[-a-z0-9!#$%&\'*+\\/=?^_`{|}~]';   // caractères autorisés avant l'arobase
			$domain = '([a-z0-9]([-a-z0-9]*[a-z0-9]+)?)'; // nom de domaine
			$regex = '/^' .$atom.'+(\.'.$atom.'+)*@('.$domain.'{1,63}\.)+'.$domain.'{2,63}$/i';
			if(preg_match($regex, $mail))
				return true;
		}
		return false;
	}
	
}
?>
